package com.atguigu.gulimall.seckill.scheduled;

import lombok.extern.slf4j.Slf4j;
import org.springframework.scheduling.annotation.Async;
import org.springframework.scheduling.annotation.EnableAsync;
import org.springframework.scheduling.annotation.EnableScheduling;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;

import java.util.concurrent.CompletableFuture;


/**
 * 测试Spring的定时任务
 */

//@EnableScheduling //开启定时任务
//@EnableAsync //开启异步任务功能
@Slf4j
@Component
public class HelloSchedule {

    /**
     * 定时任务
     *      1、@EnableScheduling 开启定时任务
     *      2、@Scheduled  开启一个定时任务
     *      3、自动配置类：TaskSchedulingAutoConfiguration
     *
     * 异步任务(就是Spring自己的线程池)
     *      1、@EnableAsync 开启异步任务功能
     *      2、@Async 给希望异步执行的方法标注
     *      3、自动配置类：TaskExecutionAutoConfiguration  属性配置：TaskExecutionProperties
     */



    /**
     *  Spring自己的定时任务的cron表达式有一些不同
     *  1、只能有6位，不允许第7位的年份（秒 分 时 几号 月份 星期几）
     *  2、第6位，星期几的位置，1-7代表周一到周日
     *  3、默认定时任务是阻塞的,第一个还没结束，第二个就不会开始。(定时任务自己有个线程池，但默认线程数是1)
     *      解决阻塞：
     *          ①可以让定时业务以异步任务的方式，自己提交到线程池
     *              CompletableFuture.runAsync(()->{...});
     *          ②设置定时任务的线程池大小，设置:TaskSchedulingProperties (不一定有用)
     *              spring.task.scheduling.size = 5
     *          ③让定时任务的方法，异步执行
     *              @EnableAsync 开启异步任务功能
     *              @Async 让方法异步执行
     *
     *      一般使用：异步任务+定时任务来完成定时任务不阻塞执行
     */
//    @Scheduled(cron = "* * * * * ?")
    public void Hello() throws InterruptedException {
      log.info("hello...");
      Thread.sleep(3000);
    }

    /**
     * 使用异步任务，解决定时任务阻塞的问题。
     */
//    @Async
//    @Scheduled(cron = "* * * * * ?")
    public void Hello2() throws InterruptedException {
        log.info("hello...");
        Thread.sleep(3000);
    }


}
